package common

import (
	"os"
	"path/filepath"
	"strings"

	"github.com/spf13/cobra"
	"github.com/spf13/viper"
)

// initConfig 设置需要读取的配置文件名、环境变量，并读取配置文件内容到 viper 中.
func InitConfig() {
	// 查找用户主目录
	home, err := os.UserHomeDir()
	// 如果获取用户主目录失败，打印 `'Error: xxx` 错误，并退出程序（退出码为 1）
	cobra.CheckErr(err)

	// 将用 `$HOME/<recommendedHomeDir>` 目录加入到配置文件的搜索路径中
	viper.AddConfigPath(filepath.Join(home, "sync-code"))

	// 把当前目录加入到配置文件的搜索路径中
	viper.AddConfigPath(".")

	// 设置配置文件格式为 YAML (YAML 格式清晰易读，并且支持复杂的配置结构)
	viper.SetConfigType("yaml")

	// 配置文件名称（没有文件扩展名）
	if os.Getenv("CONFIG") == "" {
		viper.SetConfigName("config.yaml")
	} else {
		viper.SetConfigName(os.Getenv("CONFIG") + ".yaml")
	}

	// 读取匹配的环境变量
	viper.AutomaticEnv()

	// 读取环境变量的前缀为 GOBASE，如果是 gobase，将自动转变为大写。
	viper.SetEnvPrefix("ohpush")

	// 以下 2 行，将 viper.Get(key) key 字符串中 '.' 和 '-' 替换为 '_'
	replacer := strings.NewReplacer(".", "_")
	viper.SetEnvKeyReplacer(replacer)

	// 读取配置文件。如果指定了配置文件名，则使用指定的配置文件，否则在注册的搜索路径中搜索
	if err := viper.ReadInConfig(); err != nil {
		Log.Errorf("Failed to read viper configuration file", "err", err)
	}

	// 打印 viper 当前使用的配置文件，方便 Debug.
	Log.Debugw("Using config file", "file", viper.ConfigFileUsed())
}
